package gm.editor;

import com.sun.scenario.scenegraph.SGGroup;
import com.sun.scenario.scenegraph.SGShape;
import com.sun.scenario.scenegraph.SGText;
import com.sun.scenario.scenegraph.SGTransform;
import gm.data.Hole;
import gm.data.HoleColor;
import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

/**
 * Lyuk komponens.
 *
 * @author imruf84
 */
public class HoleComponent extends SGGroup {

    /**
     * Lyuk külső mérete.
     */
    public static final double OUTER_SIZE = 5;
    public static final double INNER_SIZE = 4;

    /**
     * Lyuk.
     */
    private final Hole hole;
    /**
     * Belső lyuk objektum.
     */
    private final SGShape inner;
    /**
     * Pozíció.
     */
    private final SGTransform.Translate translate;
    /**
     * Csoport.
     */
    private final SGGroup group;
    /**
     * Szöveg.
     */
    private final SGText textNode;

    /**
     * Konsohtruktor.
     *
     * @param hole lyuk
     */
    public HoleComponent(Hole hole) {

        this.hole = hole;

        this.group = new SGGroup();

        double sih = HoleComponent.INNER_SIZE / 2;
        this.inner = new SGShape();
        this.inner.setShape(new Rectangle2D.Double(-sih, -sih, HoleComponent.INNER_SIZE, HoleComponent.INNER_SIZE));
        this.group.add(this.inner);

        this.translate = SGTransform.createTranslation(0, 0, null);
        this.translate.setChild(this.group);
        this.add(this.translate);

        this.translate.setTranslation(hole.getColumn() * HoleComponent.OUTER_SIZE, hole.getRow() * HoleComponent.OUTER_SIZE);

        this.textNode = new SGText();
        textNode.setFont(new Font("arial", Font.PLAIN, 2));
        textNode.setVerticalAlignment(SGText.VAlign.TOP);
        textNode.setHorizontalAlignment(SGText.HAlign.CENTER);

        this.setHoleColor(this.hole.getHoleColor());

        this.group.add(textNode);

    }

    /**
     * Lyuk lekérdezése.
     *
     * @return lyuk
     */
    public Hole getHole() {
        return this.hole;
    }

    /**
     * Belső lyuk objektum lekérdezése.
     *
     * @return belső lyuk objektum
     */
    public SGShape getInnerHoleShape() {
        return this.inner;
    }

    /**
     * Szín megadása.
     *
     * @param color szín
     */
    public final void setHoleColor(HoleColor color) {

        if (null == color) {
            return;
        }

        this.hole.setHoleColor(color);
        this.inner.setFillPaint(color.getColor());
        this.textNode.setFillPaint(HoleComponent.getContrastColor(color.getColor()));
        textNode.setLocation(new Point2D.Double());
        this.textNode.setText(color.getSymbol() + "");
        Rectangle r = textNode.getShape().getBounds();
        textNode.setLocation(
                new Point2D.Double(
                        -((double) r.width + (double) r.x) / 2,
                        -((double) r.height + (double) r.y) / 2
                )
        );
    }

    /**
     * Színtől legjobban eltérő árnyalat előállítása.
     *
     * @param color szín
     * @return legjobban eltérő szín
     */
    public static Color getContrastColor(Color color) {
        double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000;
        return y >= 128 ? Color.black : Color.white;
    }
}
